import router from '@/routers/index';
import { ElNotification } from 'element-plus';
import { defineStore } from 'pinia';
import { computed, ref } from 'vue';
import { useUserStore } from './user';

// 定义需要使用弹窗登录的页面路径
const DIALOG_LOGIN_ROUTES = [
  '/blogCreate', // 文章创作页面
  '/apps/editor' // 编辑器应用
  // 可以继续添加其他需要保持状态的页面
];

/**
 * Token过期管理 Store
 * 统一处理token过期情况，根据页面类型选择弹窗或跳转
 */
export const useTokenExpiredStore = defineStore(
  'tokenExpired',
  () => {
    // ==================== State 状态 ====================

    /** 是否正在处理token过期 */
    const isHandlingExpired = ref(false);

    /** 是否正在显示token过期弹窗 */
    const isShowingTokenDialog = ref(false);

    /** 待重定向的URL */
    const pendingRedirect = ref<string | null>(null);

    // ==================== Getters 计算属性 ====================

    /** 检查是否正在显示过期对话框 */
    const isDialogShowing = computed(() => isHandlingExpired.value);

    /** 检查是否正在显示token过期弹窗 */
    const isTokenDialogShowing = computed(() => isShowingTokenDialog.value);

    /** 获取当前路由路径 */
    const currentRoutePath = computed(() => {
      return router.currentRoute.value.fullPath;
    });

    /** 检查当前路由是否需要使用弹窗登录 */
    const shouldUseDialogLogin = computed(() => {
      return DIALOG_LOGIN_ROUTES.some(route => currentRoutePath.value.startsWith(route));
    });

    // ==================== Actions 操作 ====================

    /**
     * 处理token过期
     * @param redirectUrl 登录成功后需要重定向的URL
     */
    const handleTokenExpired = async (redirectUrl?: string): Promise<void> => {
      // 如果已经在处理过期，不重复处理
      if (isHandlingExpired.value) {
        return;
      }

      isHandlingExpired.value = true;

      // 保存当前需要重定向的URL
      if (redirectUrl) {
        pendingRedirect.value = redirectUrl;
      } else {
        // 如果没有提供重定向URL，保存当前页面路径
        pendingRedirect.value = currentRoutePath.value;
      }

      // 清除用户状态
      const userStore = useUserStore();
      await userStore.resetToken();

      // 根据页面类型选择处理方式
      if (shouldUseDialogLogin.value) {
        showTokenExpiredDialog();
      } else {
        redirectToLogin();
      }
    };

    /**
     * 显示token过期弹窗
     */
    const showTokenExpiredDialog = (): void => {
      isShowingTokenDialog.value = true;
      // 弹窗组件会自动响应状态变化，无需手动事件
    };

    /**
     * 重定向到登录页
     */
    const redirectToLogin = (): void => {
      const loginPath = '/login';

      // 显示友好的过期提示
      ElNotification({
        title: '登录已过期',
        message: '您的登录状态已过期，请重新登录以继续使用',
        type: 'warning',
        duration: 5000,
        showClose: false
      });

      // 如果有重定向URL，将其作为查询参数
      if (pendingRedirect.value && pendingRedirect.value !== '/login') {
        router.push({
          path: loginPath,
          query: {
            redirect: encodeURIComponent(pendingRedirect.value)
          }
        });
      } else {
        router.push(loginPath);
      }
    };

    /**
     * 登录成功后调用此方法重定向回原页面
     */
    const redirectAfterLogin = (): void => {
      if (pendingRedirect.value) {
        const redirectUrl = decodeURIComponent(pendingRedirect.value);
        pendingRedirect.value = null;

        // 重置状态
        isHandlingExpired.value = false;

        // 跳转到原页面
        router.push(redirectUrl).catch(() => {
          // 如果跳转失败（比如路由不存在），跳转到首页
          router.push('/');
        });
      } else {
        isHandlingExpired.value = false;
        router.push('/');
      }
    };

    /**
     * 弹窗登录成功后调用此方法
     */
    const handleDialogLoginSuccess = (): void => {
      // 重置状态
      isHandlingExpired.value = false;
      isShowingTokenDialog.value = false;
      pendingRedirect.value = null;
    };

    /**
     * 弹窗登录取消后调用此方法
     */
    const handleDialogLoginCancel = (): void => {
      // 用户取消登录，可以选择稍后再次提示或不提示
      isHandlingExpired.value = false;
      isShowingTokenDialog.value = false;
      // 保留pendingRedirect，以便用户稍后登录时能回到原页面
    };

    /**
     * 重置管理器状态
     */
    const reset = (): void => {
      isHandlingExpired.value = false;
      isShowingTokenDialog.value = false;
      pendingRedirect.value = null;
    };

    /**
     * 添加需要弹窗登录的路径
     */
    const addDialogLoginRoute = (path: string): void => {
      if (!DIALOG_LOGIN_ROUTES.includes(path)) {
        DIALOG_LOGIN_ROUTES.push(path);
      }
    };

    /**
     * 移除需要弹窗登录的路径
     */
    const removeDialogLoginRoute = (path: string): void => {
      const index = DIALOG_LOGIN_ROUTES.indexOf(path);
      if (index > -1) {
        DIALOG_LOGIN_ROUTES.splice(index, 1);
      }
    };

    /**
     * 获取所有需要弹窗登录的路径
     */
    const getDialogLoginRoutes = (): string[] => {
      return [...DIALOG_LOGIN_ROUTES];
    };

    /**
     * 检查指定路径是否需要弹窗登录
     */
    const isDialogLoginRoute = (path: string): boolean => {
      return DIALOG_LOGIN_ROUTES.some(route => path.startsWith(route));
    };

    // ==================== 返回 ====================

    return {
      // State
      isHandlingExpired,
      isShowingTokenDialog,
      pendingRedirect,

      // Getters
      isDialogShowing,
      isTokenDialogShowing,
      currentRoutePath,
      shouldUseDialogLogin,

      // Actions
      handleTokenExpired,
      showTokenExpiredDialog,
      redirectToLogin,
      redirectAfterLogin,
      handleDialogLoginSuccess,
      handleDialogLoginCancel,
      reset,
      addDialogLoginRoute,
      removeDialogLoginRoute,
      getDialogLoginRoutes,
      isDialogLoginRoute
    };
  },
  {
    // 持久化配置（根据需要配置）
    persist: {
      key: 'tokenExpired',
      storage: sessionStorage, // 使用sessionStorage，页面关闭后清除
      paths: ['pendingRedirect'] // 只持久化重定向URL
    }
  }
);
